/*
 * PPD.c
 *
 *  Created on: 15/09/2011
 *      Author: agustin
 */

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <string.h>
#include <stdint.h>


//#define FILEPATH "/home/alejandro/fat32.disk"

int abrirArchivo(char* filepath, struct stat *datos)
{
    int sizeofpage,archivo;
    archivo = open(filepath, O_RDWR);
    if (archivo < 0){
    perror("No se puede abrir el archivo");};
    sizeofpage = getpagesize();
    posix_madvise(NULL, sizeofpage, MADV_SEQUENTIAL);
    stat (filepath, datos);
    return archivo;
}

char *leerSector(int n_sector, struct stat estado, int archivo)
{
	char *data;
	static char buffer[512];
	int NroPagina, sizeofpage, offset;
	div_t division;
	sizeofpage = getpagesize();
	division = div(n_sector, 8);
	NroPagina = division.quot * sizeofpage; // Cociente de la division //
	offset = division.rem * 512; // Resto de la division //
	data = (char *) mmap(0, sizeofpage, PROT_READ, MAP_SHARED, archivo, NroPagina);
	memcpy(buffer, data + offset, 512);
	munmap(data, sizeofpage);

    //data += offset;
    return buffer;
}

void escribirSector(uint32_t n_sector, uint8_t archivo, struct stat estado,
	char* datos, uint16_t longitud_datos) {
	char *data;
	uint16_t sizeofpage, offset;
	uint32_t NroPagina;
	sizeofpage = getpagesize();
	NroPagina = (n_sector / 8) * sizeofpage; // Cociente de la division //
	offset = (n_sector % 8) * 512; // Resto de la division //
	data = (char *) mmap(0 , sizeofpage, PROT_READ | PROT_WRITE, MAP_SHARED, archivo, NroPagina);
	memcpy(data + offset, datos, longitud_datos);
	msync(data, sizeofpage, MS_SYNC);
	munmap(data, sizeofpage);
}
